import axios from 'axios'
import { showFailToast, Toast } from 'vant'

// 创建axios实例
const request = axios.create({
  baseURL: import.meta.env.PROD ? 'https://preview1.guducat.laffey.cc' : '', // 生产环境使用指定的API地址，开发环境使用代理
  timeout: 10000, // 请求超时时间 - 10秒，适合移动端网络环境
  headers: {
    'Content-Type': 'application/json'
  }
})
//TODO: BUG：登录合并数据异常
// 请求拦截器
request.interceptors.request.use(
  config => {
    // 打印请求方法日志（开发环境）
    if (import.meta.env.DEV) {
      console.log(`[Request] ${config.method.toUpperCase()} ${config.url}`, config)
    }

    // 从localStorage获取token
    const token = localStorage.getItem('admin_token')

    // 如果有token，则添加到请求头（与后端Sa-Token配置保持一致）
    if (token) {
      config.headers['satoken'] = token
      if (import.meta.env.DEV) {
        console.log('已添加satoken请求头:', token)
      }
    }

    // 确保POST请求使用正确的Content-Type
    if (config.method === 'post') {
      config.headers['Content-Type'] = 'application/json'
    }
    return config
  },
  error => {
    console.error('请求错误:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
request.interceptors.response.use(
  response => {
    // 如果返回的状态码为200，说明接口请求成功，直接返回响应数据
    if (response.status === 200) {
      return response.data
    }

    console.error('响应错误:', response)
    return Promise.reject(new Error('请求失败'))
  },
  error => {
    console.error('响应错误:', error)

    // 处理不同的错误状态
    if (error.response) {
      const { status, data } = error.response

      switch (status) {
        case 401:
          showFailToast('登录已过期，请重新登录')
          // 清除所有用户相关的本地存储
          localStorage.removeItem('admin_token')
          localStorage.removeItem('userInfo')
          localStorage.removeItem('rememberedUser')

          // 清除用户状态（通过动态导入避免循环依赖）
          import('../stores/user').then(({ useUserStore }) => {
            const userStore = useUserStore()
            userStore.clearUserInfo()
          }).catch(err => {
            console.error('清除用户状态失败:', err)
          })

          // 延迟跳转到登录页面，避免在某些组件中直接跳转导致的问题
          setTimeout(() => {
            if (window.location.hash !== '#/login') {
              window.location.hash = '#/login'
            }
          }, 1000)
          break
        case 403:
          showFailToast('没有权限访问')
          break
        case 404:
          showFailToast('请求的资源不存在')
          break
        case 500:
          showFailToast('服务器内部错误')
          break
        default:
          // 优先使用SaResult格式的错误信息
          const errorMessage = data?.msg || data?.message || '请求失败'
          showFailToast(errorMessage)
      }
    } else if (error.code === 'ECONNABORTED') {
      showFailToast('请求超时，请检查网络连接')
    } else {
      showFailToast('网络连接失败')
    }

    return Promise.reject(error)
  }
)

export default request
